#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 离散化数组
vector<int> disc;
// 并查集数组
vector<int> f;

// 查找元素所在集合的根节点
int findfa(int idx) {
    return f[idx] = f[idx] == idx ? idx : findfa(f[idx]);
}

// 离散化函数，将数值映射到较小的连续整数范围
int get(int x) {
    return lower_bound(disc.begin(), disc.end(), x) - disc.begin() + 1;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> x(n), y(n), z(n);
        disc.clear();

        // 读取输入并收集所有需要离散化的数值
        for (int i = 0; i < n; ++i) {
            cin >> x[i] >> y[i] >> z[i];
            disc.push_back(x[i]);
            disc.push_back(y[i]);
        }

        // 对需要离散化的数值进行排序和去重
        sort(disc.begin(), disc.end());
        disc.erase(unique(disc.begin(), disc.end()), disc.end());

        int m = disc.size();
        f.resize(m + 1);
        // 初始化并查集
        for (int i = 1; i <= m; ++i) {
            f[i] = i;
        }

        // 先处理所有相等关系
        for (int i = 0; i < n; ++i) {
            if (z[i]) {
                int a = get(x[i]);
                int b = get(y[i]);
                int fa = findfa(a);
                int fb = findfa(b);
                f[fa] = fb;
            }
        }

        bool flag = false;
        // 再检查所有不等关系
        for (int i = 0; i < n; ++i) {
            if (!z[i]) {
                int a = get(x[i]);
                int b = get(y[i]);
                int fa = findfa(a);
                int fb = findfa(b);
                if (fa == fb) {
                    flag = true;
                    break;
                }
            }
        }

        if (flag) {
            cout << "NO" << endl;
        } else {
            cout << "YES" << endl;
        }
    }
    return 0;
}